using System;
using System.IO;
using System.Threading.Tasks;
using JlPay.Sdk.Core;
using JlPay.Sdk.Models;
using JlPay.Sdk.Services;

namespace JlPay.Sdk.Examples
{
    /// <summary>
    /// 文件上传示例程序
    /// </summary>
    public class FileUploadDemo
    {
        // SM2私钥（PEM格式）
        private const string SM2PrivateKeyPem = @"-----BEGIN EC PRIVATE KEY-----
MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgHqOp471SMDsQml2G
2ErpZPLD2X7rbMqa6P1O9Zqlhe+gCgYIKoEcz1UBgi2hRANCAAQkmEWaN4xGn0bB
KHG1a6e/pafL/+YODalye7SWUNC8hijk7dH5qXf016RyJnQEitPbVj9AmteAkijI
GvpJOaXq
-----END EC PRIVATE KEY-----";
        
        // 嘉联支付平台公钥（PEM格式）
        private const string JlpayPublicKeyPem = @"-----BEGIN PUBLIC KEY-----
MIIBMzCB7AYHKoZIzj0CATCB4AIBATAsBgcqhkjOPQEBAiEA/////v//////////
//////////8AAAAA//////////8wRAQg/////v////////////////////8AAAAA
//////////wEICjp+p6dn140TVqeS89lCafzl4n1FauPkt28vUFNlA6TBEEEMsSu
LB8ZgRlfmQRGajnJlI/jC7/yZgvhcVpFiTNMdMe8Nzai9PZ3nFm9zuNraSFT0KmH
fMYqR0AC3zLlITnwoAIhAP////7///////////////9yA99rIcYFK1O79Ak51UEj
AgEBA0IABKZ3VWwH0Aw9xvOWXb+xM2gXyApWEAZLFy8UyIigp3ehOTwPJ693njrg
NavTLdzAtFBqXRreivlwBTIFy8iRgn8=
-----END PUBLIC KEY-----";
        
        // 如果需要使用十六进制格式，可以使用这个
        // private const string JlpayPublicKeyHex = "a677556c07d00c3dc6f3965dbfb1336817c80a5610064b172f14c888a0a777a1393c0f27af779e3ae035abd32ddcc0b4506a5d1ade8af970053205cbc891827f";

        /// <summary>
        /// 程序入口
        /// </summary>
        public static async Task Main(string[] args)
        {
            Console.WriteLine("🔧 启用调试模式");
            
            // 创建配置
            var config = CreateConfig();
            
            // 打印配置信息
            PrintConfig(config);
            
            // 确保示例文件目录存在
            CreateSampleFilesDir();
            
            // 创建文件服务
            var fileService = new FileService(config);
            
            Console.WriteLine("=" + new string('=', 48));
            Console.WriteLine("===== 商户文件上传示例 开始 =====");
            Console.WriteLine("=" + new string('=', 48));
            
            // 示例1: 上传图片
            Console.WriteLine("\n=== 图片上传示例 ===");
            try
            {
                await UploadImageExample(fileService);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"图片上传失败: {ex.Message}");
                PrintDebugInfo("图片上传", ex);
            }
            
            // 示例2: 上传视频
            Console.WriteLine("\n=== 视频上传示例 ===");
            try
            {
                await UploadVideoExample(fileService);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"视频上传失败: {ex.Message}");
                PrintDebugInfo("视频上传", ex);
            }
            
            // 示例3: 上传PDF
            Console.WriteLine("\n=== PDF上传示例 ===");
            try
            {
                await UploadPdfExample(fileService);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"PDF上传失败: {ex.Message}");
                PrintDebugInfo("PDF上传", ex);
            }
            
            Console.WriteLine("\n=" + new string('=', 48));
            Console.WriteLine("===== 所有示例执行完毕 =====");
            Console.WriteLine("=" + new string('=', 48));
        }

        /// <summary>
        /// 创建配置
        /// </summary>
        private static Config CreateConfig()
        {
            return new Config
            {
                BaseUrl = "https://upload-uat.jlpay.com",
                AppId = "1vzougr30f9vcw", // 应用ID
                PrivateKey = SM2PrivateKeyPem,
                JlpayPublicKey = JlpayPublicKeyPem,
                Debug = true,
                TimeoutMs = 60000 // 文件上传需要更长超时时间
            };
        }

        /// <summary>
        /// 打印配置信息
        /// </summary>
        private static void PrintConfig(Config config)
        {
            Console.WriteLine("\n📋 配置信息:");
            Console.WriteLine($"  BaseURL: {config.BaseUrl}");
            Console.WriteLine($"  AppId: {config.AppId}");
            Console.WriteLine($"  Timeout: {config.TimeoutMs}ms");
            Console.WriteLine($"  私钥长度: {config.PrivateKey.Length} 字符");
            Console.WriteLine($"  公钥长度: {config.JlpayPublicKey.Length} 字符");
        }

        /// <summary>
        /// 打印调试信息
        /// </summary>
        private static void PrintDebugInfo(string operation, Exception ex)
        {
            Console.WriteLine($"\n🔍 {operation} 调试信息:");
            Console.WriteLine($"  错误类型: {ex.GetType().Name}");
            Console.WriteLine($"  错误信息: {ex.Message}");
            
            if (ex.InnerException != null)
            {
                Console.WriteLine($"  内部异常: {ex.InnerException.Message}");
            }
            
            Console.WriteLine("  建议检查项:");
            Console.WriteLine("    1. 网络连接是否正常");
            Console.WriteLine("    2. 私钥格式是否正确");
            Console.WriteLine("    3. AppId是否有效");
            Console.WriteLine("    4. 文件是否存在且格式正确");
            Console.WriteLine("    5. 上传服务地址是否正确");
        }

        /// <summary>
        /// 创建示例文件目录
        /// </summary>
        private static void CreateSampleFilesDir()
        {
            var sampleDir = Path.Combine(".", "sample_files");
            if (!Directory.Exists(sampleDir))
            {
                try
                {
                    Directory.CreateDirectory(sampleDir);
                    Console.WriteLine($"创建了示例文件目录: {sampleDir}");
                    Console.WriteLine("请在此目录中放置测试用的图片、视频和PDF文件");
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"创建示例文件目录失败: {ex.Message}");
                }
            }
        }

        /// <summary>
        /// 获取示例文件路径
        /// </summary>
        private static (string path, bool exists) GetExampleFilePath(string filename)
        {
            // 检查examples/sample_files目录下是否有示例文件
            var examplePath = Path.Combine(".", "sample_files", filename);
            if (File.Exists(examplePath))
            {
                return (examplePath, true);
            }

            // 检查当前目录下是否有文件
            var currentPath = filename;
            if (File.Exists(currentPath))
            {
                return (currentPath, true);
            }

            // 如果都不存在，返回建议的路径
            return (examplePath, false);
        }

        /// <summary>
        /// 打印文件信息
        /// </summary>
        private static void PrintFileInfo(string filePath)
        {
            try
            {
                var fileInfo = new FileInfo(filePath);
                Console.WriteLine("📁 文件信息:");
                Console.WriteLine($"  文件名: {fileInfo.Name}");
                Console.WriteLine($"  文件大小: {fileInfo.Length} bytes ({fileInfo.Length / 1024.0:F2} KB)");
                Console.WriteLine($"  修改时间: {fileInfo.LastWriteTime:yyyy-MM-dd HH:mm:ss}");
                Console.WriteLine($"  文件扩展名: {fileInfo.Extension}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"❌ 无法获取文件信息: {ex.Message}");
            }
        }

        /// <summary>
        /// 打印响应信息
        /// </summary>
        private static void PrintResponseInfo(string operation, FileUploadResponse response)
        {
            Console.WriteLine($"\n🔍 {operation} 响应信息:");
            Console.WriteLine($"  响应状态: {response.IsSuccess()}");
            
            if (!string.IsNullOrEmpty(response.GetRetCode()))
            {
                Console.WriteLine($"  返回码: {response.GetRetCode()}");
            }
            
            if (!string.IsNullOrEmpty(response.GetRetMsg()))
            {
                Console.WriteLine($"  返回消息: {response.GetRetMsg()}");
            }
            
            if (!string.IsNullOrEmpty(response.GetFileUrl()))
            {
                Console.WriteLine($"  文件URL: {response.GetFileUrl()}");
            }
            
            if (!string.IsNullOrEmpty(response.GetMediaId()))
            {
                Console.WriteLine($"  媒体ID: {response.GetMediaId()}");
            }
        }

        /// <summary>
        /// 图片上传示例
        /// </summary>
        private static async Task UploadImageExample(FileService fileService)
        {
            // 获取示例图片文件路径
            var (filePath, exists) = GetExampleFilePath("test_image.png");
            
            if (!exists)
            {
                Console.WriteLine($"提示: 测试文件不存在。请将您的测试文件放置在以下位置:");
                Console.WriteLine($"1. {filePath}");
                Console.WriteLine($"2. test_image.png (当前目录)");
                Console.WriteLine("支持的图片格式: .jpg, .jpeg, .png, .gif, .bmp");
                return;
            }

            Console.WriteLine($"使用图片文件: {filePath}");

            // 打印文件信息
            PrintFileInfo(filePath);

            // 创建图片上传请求
            var request = new ImageUploadRequest();

            // 设置文件路径
            Console.WriteLine("🔧 正在设置文件路径...");
            request.SetFileFromPath(filePath);

            // 打印请求信息
            Console.WriteLine("\n📤 请求信息:");
            Console.WriteLine($"  API URI: {request.GetApiUri()}");
            Console.WriteLine($"  文件名: {request.FileName}");
            Console.WriteLine($"  Meta信息: {request.Meta}");

            // 发送上传请求
            Console.WriteLine("📤 正在发送上传请求...");
            var response = await fileService.UploadImageAsync(request);

            // 打印响应信息
            PrintResponseInfo("图片上传", response);

            // 处理响应
            if (response.IsSuccess())
            {
                Console.WriteLine("✅ 图片上传成功！");
                if (!string.IsNullOrEmpty(response.GetFileUrl()))
                {
                    Console.WriteLine($"  文件URL: {response.GetFileUrl()}");
                }
                if (!string.IsNullOrEmpty(response.GetMediaId()))
                {
                    Console.WriteLine($"  媒体ID: {response.GetMediaId()}");
                }
            }
            else
            {
                Console.WriteLine($"❌ 图片上传失败: {response.GetRetCode()} - {response.GetRetMsg()}");
            }
        }

        /// <summary>
        /// 视频上传示例
        /// </summary>
        private static async Task UploadVideoExample(FileService fileService)
        {
            // 获取示例视频文件路径
            var (filePath, exists) = GetExampleFilePath("test_video.mp4");
            
            if (!exists)
            {
                Console.WriteLine($"提示: 测试文件不存在。请将您的测试文件放置在以下位置:");
                Console.WriteLine($"1. {filePath}");
                Console.WriteLine($"2. test_video.mp4 (当前目录)");
                Console.WriteLine("支持的视频格式: .mp4, .avi, .mov, .wmv, .flv");
                return;
            }

            Console.WriteLine($"使用视频文件: {filePath}");

            // 打印文件信息
            PrintFileInfo(filePath);

            // 创建视频上传请求
            var request = new VideoUploadRequest();

            // 设置文件路径
            Console.WriteLine("🔧 正在设置文件路径...");
            request.SetFileFromPath(filePath);

            // 打印请求信息
            Console.WriteLine("\n📤 请求信息:");
            Console.WriteLine($"  API URI: {request.GetApiUri()}");
            Console.WriteLine($"  文件名: {request.FileName}");
            Console.WriteLine($"  Meta信息: {request.Meta}");

            // 发送上传请求
            Console.WriteLine("📤 正在发送上传请求...");
            var response = await fileService.UploadVideoAsync(request);

            // 打印响应信息
            PrintResponseInfo("视频上传", response);

            // 处理响应
            if (response.IsSuccess())
            {
                Console.WriteLine("✅ 视频上传成功！");
                if (!string.IsNullOrEmpty(response.GetFileUrl()))
                {
                    Console.WriteLine($"  文件URL: {response.GetFileUrl()}");
                }
                if (!string.IsNullOrEmpty(response.GetMediaId()))
                {
                    Console.WriteLine($"  媒体ID: {response.GetMediaId()}");
                }
            }
            else
            {
                Console.WriteLine($"❌ 视频上传失败: {response.GetRetCode()} - {response.GetRetMsg()}");
            }
        }

        /// <summary>
        /// PDF上传示例
        /// </summary>
        private static async Task UploadPdfExample(FileService fileService)
        {
            // 获取示例PDF文件路径
            var (filePath, exists) = GetExampleFilePath("test_document.pdf");
            
            if (!exists)
            {
                Console.WriteLine($"提示: 测试文件不存在。请将您的测试文件放置在以下位置:");
                Console.WriteLine($"1. {filePath}");
                Console.WriteLine($"2. test_document.pdf (当前目录)");
                Console.WriteLine("支持的文档格式: .pdf");
                return;
            }

            Console.WriteLine($"使用PDF文件: {filePath}");

            // 打印文件信息
            PrintFileInfo(filePath);

            // 创建PDF上传请求
            var request = new PdfUploadRequest();

            // 设置文件路径
            Console.WriteLine("🔧 正在设置文件路径...");
            request.SetFileFromPath(filePath);

            // 打印请求信息
            Console.WriteLine("\n📤 请求信息:");
            Console.WriteLine($"  API URI: {request.GetApiUri()}");
            Console.WriteLine($"  文件名: {request.FileName}");
            Console.WriteLine($"  Meta信息: {request.Meta}");

            // 发送上传请求
            Console.WriteLine("📤 正在发送上传请求...");
            var response = await fileService.UploadPdfAsync(request);

            // 打印响应信息
            PrintResponseInfo("PDF上传", response);

            // 处理响应
            if (response.IsSuccess())
            {
                Console.WriteLine("✅ PDF上传成功！");
                if (!string.IsNullOrEmpty(response.GetFileUrl()))
                {
                    Console.WriteLine($"  文件URL: {response.GetFileUrl()}");
                }
                if (!string.IsNullOrEmpty(response.GetMediaId()))
                {
                    Console.WriteLine($"  媒体ID: {response.GetMediaId()}");
                }
            }
            else
            {
                Console.WriteLine($"❌ PDF上传失败: {response.GetRetCode()} - {response.GetRetMsg()}");
            }
        }
    }
} 